﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//字符串逆序
//abcdef
//fedcba
//#include <string.h>
//void Reverse(char* str)
//{
//	int len = strlen(str);
//	char* left = str;
//	char* right = str + len - 1;
//
//	while (left < right)
//	{
//		char tmp = *left;
//		*left = *right;
//		*right = tmp;
//		left++;
//		right--;
//	}
//}
//int main()
//{
//	char str[10000] = { 0 };
//	while (gets(str))
//	{
//		Reverse(str);
//		printf("%s\n");
//	}
//	return 0;
//}

//int check_sys()
//{
//	int a = 1;
//	return  (*(char*)&a);
//	//如果是小段返回1，大端返回0
//}
//int main()
//{
//	if (1 == check_sys())
//	{
//		printf("小段\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}

//判断当前的机器是大端存储还是小端存储
//int main()
//{
//	int a = 1;
//	if (*(char*)&a == 1)
//	{
//		printf("小段\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}
//int check_sys()
//{
//	int a = 1;
//	return (*(char*)&a);
//}
//int main()
//{
//	if (1 == check_sys())
//	{
//		printf("小端\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}

//法一：
//int main()
//{
//	int a = 1;
//	if (1 == *(char*)&a)
//	{
//		printf("小端\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}

//法二;
//int check_sys()
//{
//	int a = 1;
//	return *(char*)&a;
//}
//int main()
//{
//	if (1 == check_sys()) {
//		printf("小端\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}
// 

//char -- signed char 取值范围：-128-127
//unsigned char 取值范围:0-2555
//char到底是signed char 还是unsigned char 是取决于编译器的，但是在VS上，
//char == signed char
//unsiged char 的变量中存放的数据只能是0-2555，存进去其他的数字，也会被转化成0-255
//int main()
//{
//	char a = -1;
//	//-1
//	//10000000 00000000 00000000 00000001  原码
//	//11111111 11111111 11111111 11111110  反码
//	//11111111 11111111 11111111 11111111  补码
//	//char 只存放8个bit，从最低位开始发生截断，保留最低位数据
//	//11111111
//	//11111111 11111111 11111111 11111111
//	//10000000 00000000 00000000 00000001
//	signed char b = -1;
//	//11111111
//	//11111111 11111111 11111111 11111111
//	//10000000 00000000 00000000 00000001
//	unsigned char c = -1;
//	//11111111
//	//00000000 00000000 00000000 11111111
//	//1+2+4+8+16+32+64+128=255
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	//%d 是打印有符号整数
//	// a,b,c这里得发生整型提升
//	// %u是打印无符号整数
//	//        -1   -1   255
//	//截断 +  整型提升
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = -128;
//	//10000000 00000000 00000000 10000000
//	//11111111 11111111 11111111 01111111
//	//11111111 11111111 11111111 10000000
//	//10000000
//	//整型提升
//	//11111111 11111111 11111111 10000000
//	//%u打印无符号数
//	//无符号整数的原码，反码，补码是相同的
//	printf("%u\n", a);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	//00000000 00000000 00000000 10000000
//	//11111111 11111111 11111111 01111111
//	//10000000 00000000 00000000 10000000
//	//10000000
//	//11111111 11111111 11111111 10000000
//	printf("%u\n", a);
//	return 0;
//}

//128 与 -128 存在a的二进制数一样
//发生整型提升时，高位补的都是1
//11111111 11111111 11111111 10000000
//%u 打印的时候，原码，反码，补码相同

//#include <string.h>
//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d", strlen(a));
//	return 0;
//}

//#include <stdio.h>
//unsigned char i = 0;
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <Windows.h>
//int main()
//{
//	unsigned int i;
//	//无符号数>=
//	for (i = 9; i >= 0; i--)//死循环了
//	{
//		printf("%u\n", i);
//		Sleep(100);//休眠100毫秒
//	}
//	return 0;
//}

//#include <stdio.h>
////X86环境 ⼩端字节序
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x,%x", ptr1[-1], *ptr2);
//	return 0;
//}
//%x 是16进制打印  前面的0会省略
//如果想要把16进制的0x打印出来 %#x
//%p 打印时前面的地址不会省略
//
//#include <stdio.h>
//int main()
//{
//	int n = 9;
//	float* pFloat = (float*)&n;
//	printf("n的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);
//	
//	*pFloat = 9.0;
//	printf("num的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);
//	return 0;
//}
//说明整型在内存中的存储方式和浮点数在内存中的存储方式是不一样的

//int main()
//{
//	float a = 5.5;
//	//5.5
//	//101.1
//	//1.011* 2^2
//	//S = 0   M = 1.011  E = 2
//	//0 10000001 0110000000000 0000000000
//	//01000000 10110000 00000000 00000000
//	//0x40 B0 00 00
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int n = 9;
//	//00000000 00000000 00000000 00001001  原码
//	//00000000 00000000 00000000 00001001  反码
//	//00000000 00000000 00000000 00001001  补码
//
//	//00000000 00000000 00000000 00001001   n
//
//	float* pFloat = (float*)&n;
//	printf("n的值为：%d\n", n);//9
//	
//	printf("*pFloat的值为：%f\n", *pFloat);
//	//0 00000000 00000000000000000001001
//	//S     E      M
//	//E位全0时 E--->1-127=-126
//	//M = 0.00000000000000000001001
//	//(-1)^0 *0.00000000000000000001001 * 2^-126
//	//0.000000
//	
//	*pFloat = 9.0;
//	printf("num的值为：%d\n", n);
//	//9.0
//	//1001.0
//	//(-1)^0 * 1.001*2^3
//	//S = 0    M = 1.001  E = 3
//	//0 10000010 00100000000000000000000
//	//01000001 00010000 00000000 00000000
//	//补码，0表示符号位正数，正数的原码反码补码相同
//	//3+127=130
//	printf("*pFloat的值为：%f\n", *pFloat);
//	//以浮点数的形式存储，然后以浮点数的形式取值，值就是9.0
//	return 0;
//}

//int main()
//{
//	float a = 3.14;
//	return 0;
//}

//浮点数比较相等的时候，

//int main()
//{
//	if (0.1 + 0.2 == 0.3)
//		printf("==\n");
//	else
//		printf("!=\n");
//	return 0;
//}

//#include <math.h>
//int main()
//{
//	if (fabs(0.1 + 0.2 - 0.3) < 0.0000001)
//	{
//		printf("==\n");
//	}
//	else {
//		printf("!=\n");
//		//误差的范围是自己来决定的
//	}
//	return 0;
//}
////fabs 函数是求浮点数的绝对值的

//int main()
//{
//	int a = 1;
//	if (*(char*)&a == 1)
//	{
//		printf("小端\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}

#include <stdio.h>
int main()
{
	//-128-127
	//0-255
	char a = -1;
	//10000001
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	//11111111 11111111 11111111 10000001  补码
	//10000000 00000000 00000000 01111111
	return 0;
}